package com.cskaoyan.javase.oop3._0abstract._3exercise;

import com.sun.org.apache.bcel.internal.classfile.Code;

/**
 * 编码练习
 * 公司正在开发一套员工管理系统，需要对公司内部存在的员工进行管理
 * 公司将员工分为三类，普通员工负责杂项工作，程序员负责技术开发，经理负责统筹规划
 * 普通员工包含3个属性：姓名、工号以及工资，行为是工作
 * 程序员包含3个属性：姓名、工号以及工资，行为是工作和加班（overtime work）
 * 经理包含4个属性：姓名、工号、工资以及奖金（bonus），行为是工作
 * 请使用所学的知识设计该员工系统
 * 要求类中提供必要的方法进行属性访问（description）
 *
 * 普通员工是可以用来做父类的,因为它暂时包含其他所有员工的属性和行为
 * 但从长期设计角度考虑不合适:
 *      因为普通员工是真实存在的,如果后续有修改,它作为父类就会将修改体现到所有员工中,这很不合适
 *
 * 最合适的是找到一个抽象类,它的作用就是用来复用成员,只有所有员工都有的成员才放进去.
 * 而且抽象类还有一个好处: 有抽象方法
 * 抽象方法起着占位的作用,是一个制定规范和标准的作用
 *
 *
 * @since 17:31
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        BaseStaff bs;
        bs = new NormalStaff("张三", 100, 10000);
        bs.work();
        bs.printStaff();
        bs = new Coder("李四", 200, 50000);
        bs.work();
        bs.printStaff();
        if (bs instanceof Coder) {
            Coder c = (Coder) bs;
            c.overTimeWork();
        }
        bs = new Manager("王总", 2, 100000, 1000000);
        bs.work();
        if (bs instanceof Manager) {
            System.out.println(((Manager) bs).bonus);
        }
        bs.printStaff();
    }
}

// 抽象的员工类
abstract class BaseStaff {
    private String name;
    private int id;
    private double salary;

    public BaseStaff(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public abstract void work();

    // 定义打印属性的方法,子类可以选择直接使用,也可以选择重写
    public void printStaff() {
        System.out.println("id是" + id + "的员工,姓名是" + name + ",Ta的工资是" + salary);
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

    public double getSalary() {
        return salary;
    }
}

class NormalStaff extends BaseStaff {
    public NormalStaff(String name, int id, double salary) {
        super(name, id, salary);
    }

    @Override
    public void work() {
        System.out.println("负责杂项工作");
    }


}

class Coder extends BaseStaff {
    public Coder(String name, int id, double salary) {
        super(name, id, salary);
    }

    @Override
    public void work() {
        System.out.println("负责技术开发");
    }

    public void overTimeWork() {
        System.out.println("996福报,蹭公司电,蹭公司网!");
    }
}

class Manager extends BaseStaff {
    double bonus;

    public Manager(String name, int id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    @Override
    public void work() {
        System.out.println("负责统筹规划");
    }

    @Override
    public void printStaff() {
        System.out.println("id是" + getId() + "的员工,姓名是" + getName() + ",Ta的工资是" + (getSalary() + bonus));
    }
}
